// 1. 鸭子父类
class Duck {
    // 属性
    protected String color;
    protected double heavy;

    // 构造方法
    public Duck(String color, double heavy) {
        this.color = color;
        this.heavy = heavy;
    }

    // 默认构造方法
    public Duck() {
        this.color = "白色";
        this.heavy = 1.0;
    }

    // 方法 - 飞行
    public void fly() {
        System.out.println("鸭子正在飞行");
    }

    // 方法 - 叫
    public void quack() {
        System.out.println("鸭子正在叫：嘎嘎嘎");
    }

    // 设置重量方法
    public void setHeavy(double heavy) {
        this.heavy = heavy;
        System.out.println("设置鸭子重量为：" + heavy + "kg");
    }

    // 显示信息方法
    public void displayInfo() {
        System.out.println("鸭子颜色：" + color + "，重量：" + heavy + "kg");
    }
}

// 2. 第一种鸭子子类 - 绿头鸭
class MallardDuck extends Duck {

    // 构造方法进行属性初始化
    public MallardDuck(String color, double heavy) {
        super(color, heavy); // 调用父类构造方法
    }

    // 重载setHeavy方法 - 参数类型不同
    public void setHeavy(int heavy) {
        this.heavy = heavy;
        System.out.println("绿头鸭重量设置为整数：" + heavy + "kg");
    }

    // 重载setHeavy方法 - 参数个数不同
    public void setHeavy(double heavy, String unit) {
        if ("g".equals(unit)) {
            this.heavy = heavy / 1000; // 转换为kg
        } else {
            this.heavy = heavy;
        }
        System.out.println("绿头鸭重量设置为：" + heavy + unit);
    }

    // 重写父类的fly方法
    @Override
    public void fly() {
        System.out.println("绿头鸭在高空快速飞行");
    }

    // 重写父类的quack方法
    @Override
    public void quack() {
        System.out.println("绿头鸭大声叫：呱呱呱");
    }
}

// 3. 第二种鸭子子类 - 橡皮鸭
class RubberDuck extends Duck {

    // 构造方法进行属性初始化
    public RubberDuck(String color, double heavy) {
        super(color, heavy);
    }

    // 重载setHeavy方法
    public void setHeavy(float heavy) {
        this.heavy = heavy;
        System.out.println("橡皮鸭重量设置为浮点数：" + heavy + "kg");
    }

    // 重载setHeavy方法 - 带描述
    public void setHeavy(double heavy, boolean isLight) {
        this.heavy = heavy;
        if (isLight) {
            System.out.println("橡皮鸭很轻，只有：" + heavy + "kg");
        } else {
            System.out.println("橡皮鸭重量为：" + heavy + "kg");
        }
    }

    // 重写父类的fly方法
    @Override
    public void fly() {
        System.out.println("橡皮鸭不会飞，只能被抛起来");
    }

    // 重写父类的quack方法
    @Override
    public void quack() {
        System.out.println("橡皮鸭发出吱吱声：吱吱吱");
    }
}

// 测试类
public class DuckTest {
    public static void main(String[] args) {
        System.out.println("=== 测试绿头鸭 ===");
        MallardDuck mallard = new MallardDuck("绿色", 2.5);
        mallard.displayInfo();
        mallard.fly();          // 调用重写后的方法
        mallard.quack();        // 调用重写后的方法

        // 测试重载方法
        mallard.setHeavy(3.0);  // 调用父类方法
        mallard.setHeavy(2);    // 调用重载方法（int参数）
        mallard.setHeavy(2500.0, "g"); // 调用重载方法（两个参数）

        System.out.println("\n=== 测试橡皮鸭 ===");
        RubberDuck rubberDuck = new RubberDuck("黄色", 0.3);
        rubberDuck.displayInfo();
        rubberDuck.fly();       // 调用重写后的方法
        rubberDuck.quack();     // 调用重写后的方法

        // 测试重载方法
        rubberDuck.setHeavy(0.5f);      // 调用重载方法（float参数）
        rubberDuck.setHeavy(0.4, true); // 调用重载方法（两个参数）

        System.out.println("\n=== 多态演示 ===");
        // 使用父类引用指向子类对象
        Duck duck1 = new MallardDuck("棕色", 2.0);
        Duck duck2 = new RubberDuck("红色", 0.2);

        duck1.fly();    // 实际调用MallardDuck的fly方法
        duck2.fly();    // 实际调用RubberDuck的fly方法
    }
}